#pragma once

#include <list>
#include <map>
#include "Pointer.h"
#include "HashedString.h"

namespace Combat
{
	class Response;
	class Combatant;
	
	class IEffect
	{
	public:
		typedef std::list<Pointer<IEffect>> List_t;
		typedef std::map<HashedString, List_t> Map_t;
		typedef std::pair<HashedString, List_t> Pair_t;

		IEffect( Combatant* owner ) : m_owner( owner ) {};

		virtual const HashedString& Type() = 0;

		virtual void OnAdd() {};
		virtual void OnRemove() {};
		virtual void OnUpdate() {};
		virtual void OnPreAttack( Response& response ) {};
		virtual void OnPreDefend( Response& response ) {};
		virtual void OnPostDefend( Response& response ) {};
		virtual void OnPostAttack( Response& response ) {};
	protected:
		Combatant* m_owner;
	};
};